home *** CD-ROM | disk | FTP | other *** search
/ MacFormat 1994 November / macformat-018.iso / Utility Spectacular / AfterDark / TwilightZone ƒ / source / twilight.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-06-17  |  8.2 KB  |  399 lines  |  [TEXT/KAHL]

  1. #include "GraphicsModule_Types.h"
  2. #include "mytypes.h"
  3. #include "grafstuff.h"
  4. #include "sndstuff.h"
  5. #include "twilight.h"
  6.  
  7. extern MonitorsInfoPtr gMonitorsInfoPtr;
  8.  
  9. OSErr GetDimmer(FSSpec *dimSpec,DimmerModulePtr *returnDimmer)
  10. {
  11.     short refNum;
  12.     Handle theDimmer;
  13.     DimmerModulePtr dimStore;
  14.     OSErr err;
  15.     SFTypeList typeList;
  16.     short soundType;
  17.         
  18.     theDimmer = nil;
  19.     
  20.     refNum = HOpenResFile(dimSpec->vRefNum,dimSpec->parID,dimSpec->name,fsRdWrPerm);
  21.     err = ResError();
  22.     if (err==noErr && refNum==-1)
  23.         err = -2;
  24.     if (err!=noErr)
  25.         return ResError();
  26.     
  27.     theDimmer = Get1IndResource(kDimmerResType,1);
  28.     
  29.     if (!HasEnoughMemory()) {
  30.         CloseResFile(refNum);
  31.         return kNotEnoughMemory;
  32.     }
  33.             
  34.     soundType = GetSoundChannel();
  35.             
  36.     if (!theDimmer)
  37.         return -3;
  38.         
  39.     DetachResource(theDimmer);
  40.     MoveHHi(theDimmer);
  41.     HLock(theDimmer);
  42.     
  43.     *returnDimmer = dimStore = (DimmerModulePtr) NewPtr(sizeof(DimmerModule));
  44.     if (MemError()!=noErr)
  45.         return MemError();
  46.     
  47.     CheckSupportedCalls(dimStore->callsSupported);
  48.  
  49.     if (SetupADGlobals(&dimStore->dimVars,soundType)!=noErr) {
  50.         DisposPtr((Ptr)dimStore);
  51.         return MemError();
  52.     }
  53.     
  54.     dimStore->dimRgn = NewRgn();
  55.     RectRgn(dimStore->dimRgn,&thePort->portRect);
  56.  
  57.     dimStore->resFile = refNum;
  58.     dimStore->theDimmer = theDimmer;
  59.     dimStore->dimStorage = 0;
  60.     dimStore->dimZone = nil;
  61.     
  62.     return noErr;
  63. }
  64.  
  65.  
  66. OSErr FreeDimmer(DimmerModulePtr dimStore)
  67. {
  68.     FreeADGlobals(dimStore->dimVars);
  69.     DisposeRgn(dimStore->dimRgn);
  70.     DisposHandle(dimStore->theDimmer);
  71.     CloseResFile(dimStore->resFile);
  72.     DisposPtr((Ptr)dimStore);
  73.     
  74.     return MemError();
  75. }
  76.  
  77.  
  78. OSErr InitDimmer(DimmerModulePtr dimStore)
  79. {
  80.     ADDimmer dimmerProc;
  81.     OSErr err;
  82.     THz saveZone;
  83.  
  84.     if (!dimStore->callsSupported[hasInit])
  85.         return noErr;
  86.     
  87.     saveZone = GetZone();
  88.     if (dimStore->dimZone)
  89.         SetZone(dimStore->dimZone);
  90.     
  91.     dimmerProc = (ADDimmer) *(dimStore->theDimmer);
  92.     dimmerProc = (ADDimmer) StripAddress(dimmerProc);
  93.     err = (dimmerProc)(&dimStore->dimStorage,dimStore->dimRgn,Initialize,dimStore->dimVars);
  94.  
  95.     dimStore->dimZone = GetZone();
  96.     SetZone(saveZone);
  97.     return err;
  98. }
  99.  
  100.  
  101. OSErr StartDimmer(DimmerModulePtr dimStore)
  102. {
  103.     ADDimmer dimmerProc;
  104.     OSErr err;
  105.     THz saveZone;
  106.     
  107.     if (!dimStore->callsSupported[hasBlank])
  108.         return noErr;
  109.         
  110.     saveZone = GetZone();
  111.     SetZone(dimStore->dimZone);
  112.     
  113.     dimmerProc = (ADDimmer) *(dimStore->theDimmer);
  114.     dimmerProc = (ADDimmer) StripAddress(dimmerProc);
  115.     err = (dimmerProc)(&dimStore->dimStorage,dimStore->dimRgn,Blank,dimStore->dimVars);
  116.  
  117.     SetZone(saveZone);
  118.     return err;
  119. }
  120.  
  121.  
  122. OSErr RunDimmer(DimmerModulePtr dimStore)
  123. {
  124.     ADDimmer dimmerProc;
  125.     OSErr err;
  126.     THz saveZone;
  127.     
  128.     if (!dimStore->callsSupported[hasDrawFrame])
  129.         return noErr;
  130.         
  131.     saveZone = GetZone();
  132.     SetZone(dimStore->dimZone);
  133.  
  134.     dimmerProc = (ADDimmer) *(dimStore->theDimmer);
  135.     dimmerProc = (ADDimmer) StripAddress(dimmerProc);
  136.     err = (dimmerProc)(&dimStore->dimStorage,dimStore->dimRgn,DrawFrame,dimStore->dimVars);
  137.  
  138.     SetZone(saveZone);
  139.     return err;
  140. }
  141.  
  142. OSErr StopDimmer(DimmerModulePtr dimStore)
  143. {
  144.     ADDimmer dimmerProc;
  145.     OSErr err;
  146.     THz saveZone;
  147.  
  148.     if (!dimStore->callsSupported[hasClose])
  149.         return noErr;
  150.         
  151.     saveZone = GetZone();
  152.     SetZone(dimStore->dimZone);
  153.  
  154.     dimmerProc = (ADDimmer) *(dimStore->theDimmer);
  155.     dimmerProc = (ADDimmer) StripAddress(dimmerProc);
  156.     err = (dimmerProc)(&dimStore->dimStorage,dimStore->dimRgn,Close,dimStore->dimVars);
  157.  
  158.     SetZone(saveZone);
  159.     return err;
  160. }
  161.  
  162.  
  163. OSErr SelectModule(DimmerModulePtr dimStore)
  164. {
  165.     ADDimmer dimmerProc;
  166.     OSErr err;
  167.     THz saveZone;
  168.  
  169.     if (!dimStore->callsSupported[hasModSelect])
  170.         return noErr;
  171.         
  172.     saveZone = GetZone();
  173.  
  174.     dimmerProc = (ADDimmer) *(dimStore->theDimmer);
  175.     dimmerProc = (ADDimmer) StripAddress(dimmerProc);
  176.     err = (dimmerProc)(&dimStore->dimStorage,dimStore->dimRgn,ModuleSelected,dimStore->dimVars);
  177.  
  178.     dimStore->dimZone = GetZone();
  179.     SetZone(saveZone);
  180.     return err;
  181. }
  182.  
  183.  
  184. OSErr SetupADGlobals(GMParamBlockPtr *retBlock,short soundType)
  185. {
  186.     SysEnvRec env;
  187.     GDHandle theGD;
  188.     OSErr err;
  189.     GMParamBlockPtr gmBlock;
  190.     
  191.     err = SysEnvirons(curSysEnvVers,&env);
  192.     if (err!=noErr)
  193.         return err;
  194.         
  195.     *retBlock = gmBlock = (GMParamBlockPtr) NewPtr(sizeof(GMParamBlock));
  196.     if (MemError()!=noErr)
  197.         return MemError();
  198.         
  199.     gmBlock->errorMessage = (StringPtr) NewPtr(sizeof(Str255));
  200.     if (MemError()!=noErr) {
  201.         DisposPtr((Ptr)gmBlock);
  202.         return MemError();
  203.     }
  204.             
  205.     GetADControlValues(gmBlock->controlValues);
  206.  
  207.     err = InitModuleQD(&gmBlock->qdGlobalsCopy);
  208.     if (err!=noErr) {
  209.         DisposPtr((Ptr)gmBlock);
  210.         DisposPtr((Ptr)gmBlock->errorMessage);
  211.         return err;
  212.     }
  213.  
  214.     err = MakeModuleSound(&gmBlock->sndChannel,soundType);
  215.     if (err!=noErr) {
  216.         DisposeModuleQD(gmBlock->qdGlobalsCopy);
  217.         DisposPtr((Ptr)gmBlock);
  218.         return err;
  219.     }
  220.  
  221.     gmBlock->monitors = gMonitorsInfoPtr;
  222.     gmBlock->colorQDAvail = (env.hasColorQD) ? true : 0;
  223.     gmBlock->systemConfig = 0;
  224.  
  225.     SetupSysConfig(gmBlock,&env);
  226.             
  227.     SetRect(&gmBlock->demoRect,0,0,0,0);
  228.     gmBlock->adVersion = 0x0200;
  229.     gmBlock->brightness = 0;
  230.     
  231.     LoadADExtensions(&gmBlock->extPtr);
  232. }
  233.  
  234.  
  235. OSErr FreeADGlobals(GMParamBlockPtr gmBlock)
  236. {
  237.     DisposeADExtensions(gmBlock->extPtr);
  238.     DisposeModuleQD(gmBlock->qdGlobalsCopy);
  239.     DisposeModuleSound(gmBlock->sndChannel);
  240.     DisposPtr((Ptr)gmBlock->errorMessage);
  241.     DisposPtr((Ptr)gmBlock);
  242. }
  243.  
  244.  
  245. Boolean HasEnoughMemory(void)
  246. {
  247.     Handle syszHandle;
  248.     long memReq;
  249.     
  250.     syszHandle = Get1Resource(kMemoryResType,0);
  251.     if (!syszHandle)
  252.         return true;
  253.     
  254.     BlockMove(*syszHandle,&memReq,sizeof(long));
  255.     ReleaseResource(syszHandle);
  256.  
  257.     return (MaxBlock() > memReq);
  258. }
  259.  
  260.  
  261. short GetSoundChannel(void)
  262. {
  263.     Handle resHandle;
  264.     short soundType;
  265.     
  266.     resHandle = Get1Resource(kSoundChannelRes,0);
  267.     if (resHandle) {
  268.         BlockMove(*resHandle,&soundType,sizeof(short));
  269.         ReleaseResource(resHandle);
  270.     }
  271.     else
  272.         soundType = -1;
  273.  
  274.     return soundType;
  275. }
  276.  
  277.  
  278. void GetADControlValues(short ctlValue[])
  279. {
  280.     short ctlIndex;
  281.     Handle ctlHandle;
  282.     
  283.     for (ctlIndex=0; ctlIndex<kNumControls; ctlIndex++) {
  284.     
  285.         ctlHandle = Get1Resource(kSliderResType,ctlIndex+1000);
  286.         if (!ctlHandle)
  287.                 ctlHandle = Get1Resource(kMenuResType,ctlIndex+1000);
  288.         if (!ctlHandle)
  289.                 ctlHandle = Get1Resource(kCheckBoxResType,ctlIndex+1000);
  290.         if (!ctlHandle)
  291.                 ctlHandle = Get1Resource(kTextResType,ctlIndex+1000);        
  292.  
  293.         if (ResError()==noErr && ctlHandle) {
  294.             BlockMove(*ctlHandle,&ctlValue[ctlIndex],sizeof(short));
  295.             ReleaseResource(ctlHandle);
  296.         }
  297.     }
  298. }
  299.  
  300.  
  301. void CheckSupportedCalls(Boolean callsSupported[])
  302. {
  303.     Handle calsHandle;
  304.     short callIndex;
  305.     unsigned char theCalls;
  306.     
  307.     callsSupported[hasInit] = true;
  308.     callsSupported[hasBlank] = true;
  309.     callsSupported[hasDrawFrame] = true;
  310.     callsSupported[hasClose] = true;
  311.     callsSupported[hasModSelect] = false;
  312.     callsSupported[hasHelp] = false;
  313.         
  314.     calsHandle = Get1IndResource(kCallSupportedRes,1);
  315.     if (!calsHandle)
  316.         return;
  317.     
  318.     theCalls = **calsHandle;
  319.     
  320.     for (callIndex=0; callIndex<kNumMessages; callIndex++)
  321.         callsSupported[callIndex] = ((theCalls & (1<<callIndex))!=0);
  322. }
  323.  
  324.  
  325. void SetupSysConfig(GMParamBlockPtr params,SysEnvRec *env)
  326. {
  327.     params->systemConfig = 0;
  328.     
  329.     if (env->hasColorQD)
  330.         params->systemConfig |= SoundAvailable;
  331.     
  332. //    params->systemConfig = 0x81ff;
  333.     params->systemConfig = 0xc1ff;
  334. }
  335.  
  336.  
  337. void UpdateScreens(void)
  338. {
  339.     WindowPtr newWindow;
  340.     Rect bigRect;
  341.     RgnHandle grayRgn;
  342.     
  343.     grayRgn = GetGrayRgn();
  344.     bigRect = (**grayRgn).rgnBBox;
  345.     
  346.     newWindow = NewWindow(nil,&bigRect,"\p",true,plainDBox,(WindowPtr)-1,false,0);
  347.     DisposeWindow(newWindow);
  348.     DrawMenuBar();
  349. }
  350.  
  351.  
  352. void LoadADExtensions(ADExtensionsPtr *adExt)
  353. {
  354.     short numExt;
  355.     short indExt;
  356.     Handle extHndl;
  357.     ADExtensionsPtr newAD;
  358.     ADExtEntry extEntry;
  359.     
  360.     numExt = CountResources(kADExtensionsType);
  361.  
  362.     newAD = (ADExtensionsPtr) NewPtr(sizeof(short)+(numExt*sizeof(ADExtRec)));
  363.     if (MemError()!=noErr) {
  364.         *adExt=nil;
  365.         return;
  366.     }
  367.     
  368.     *adExt = newAD;
  369.  
  370.     newAD->numExtensions = numExt;
  371.         
  372.     for (indExt=0; indExt<numExt; indExt++) {
  373.         extHndl = GetIndResource(kADExtensionsType,indExt+1);    // from app rsrc fork
  374.         if (ResError()==noErr && extHndl) {
  375. //            DetachResource(extHndl);            keep rsrcs in memory
  376.             MoveHHi(extHndl);
  377.             HLock(extHndl);
  378.             extEntry = (ADExtEntry) *extHndl;
  379.             (extEntry)(&newAD->extPtr[indExt].extSig,&newAD->extPtr[indExt].extProc);
  380.         }
  381.     }
  382. }
  383.  
  384.  
  385. void DisposeADExtensions(ADExtensionsPtr adExt)
  386. {
  387.     short indExt;
  388.     Handle codeHndl;
  389.     
  390. /*    for (indExt = 0; indExt < adExt->numExtensions; indExt++) {
  391.         codeHndl = RecoverHandle(adExt->extPtr[indExt].extProc);
  392.         if (codeHndl)
  393.             DisposeHandle(codeHndl);
  394.     }
  395. rsrcs are still in memory */
  396.     
  397.     DisposePtr((Ptr)adExt);
  398. }
  399.